#include "serverwidget.h"
#include "ui_serverwidget.h"
#include<QDebug>

ServerWidget::ServerWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ServerWidget)
{
    ui->setupUi(this);
    //监听套接字
    tcpserver = new QTcpServer(this);

    tcpserver->listen(QHostAddress::Any,8888);
    setWindowTitle("服务器端口：8888");

    //未连接前两个按钮都不能按，设定为灰色
    ui->buttonFile->setEnabled(false);
    ui->buttonSend->setEnabled(false);

    //如果客户端成功和服务器连接，tcpserver会自动触发newConnection
    connect(tcpserver,&QTcpServer::newConnection,
            [=]()
            {
              //取出建立好连接的套接字
                tcpsocket = tcpserver->nextPendingConnection();

                QString ip = tcpsocket->peerAddress().toString();
                quint16 port = tcpsocket->peerPort();

                qDebug() << port << endl;
                QString str = QString("[%1:%2] 成功连接").arg(ip).arg(port);
                ui->textEdit->setText(str);

                //成功连接后，才可以按选择文件按钮
                ui->buttonFile->setEnabled(true);
            }
            );
       connect(&timer,&QTimer::timeout,
               [=]()
               {
                   //关闭定时器
                   timer.stop();

                   //发送文件
                   sendData();
               }
               );
}

ServerWidget::~ServerWidget()
{
    delete ui;
}

void ServerWidget::on_buttonFile_clicked()
{
    QString  filePath = QFileDialog::getOpenFileName(this,"open","../");
    if(filePath.isEmpty() == false)//如果选择的文件路径有效
    {
        fileName.clear();
        fileSize = 0;

       //获取文件信息
        QFileInfo info(filePath);
        fileName = info.fileName();
        fileSize = info.size();
        sendSize = 0;

       //只读方式打开
        file.setFileName(filePath);
        bool isOK = file.open(QIODevice::ReadOnly);
        if(isOK == false)
        {
            qDebug() << "只读方式打开文件失败";
        }

        //提示打开文件的路径
        ui->textEdit->append(filePath);

        ui->buttonFile->setEnabled(false);
        ui->buttonSend->setEnabled(true);
    }
    else
    {
        qDebug() << "选择文件路径出错";
    }
}

void ServerWidget::on_buttonSend_clicked()
{
    //先发送文件头信息
    QString head = QString("%1##%2").arg(fileName).arg(fileSize);
    qint64 len = tcpsocket->write(head.toUtf8());
    if(len > 0)//头部信息发送成功
    {
        //发送真正的文件信息
        //防止TCP黏包文件
        //需要通过定时器延时20ms
        timer.start(20);
    }
    else
    {
        qDebug() << "头部信息发送失败";
        file.close();
        ui->buttonFile->setEnabled(true);
        ui->buttonSend->setEnabled(false);
    }
}

void ServerWidget::sendData()
{
  qint64 len = 0;
  do
  {
     //每次发送数据的大小 4k
      char buf[4*1024] = {0};
      len = 0;

      //往文件中写数据
      len = file.read(buf,sizeof (buf));
      //发送数据，读多少发多少
      len = tcpsocket->write(buf,len);

      //发送的数据需要累积
      sendSize += len;

  }while(len > 0);

  if(sendSize ==fileSize)
  {
      ui->textEdit->append("文件发送完毕");
      file.close();

      tcpsocket->disconnectFromHost();
      tcpsocket->close();
  }
}
